from qfluentwidgets import (
    NavigationItemPosition,
    FluentWindow,
    SubtitleLabel,
    setFont,
    SplashScreen,
    SystemThemeListener,
)
from qfluentwidgets import FluentIcon as FIF
from PyQt6.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QFrame,
)
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import QSize

from views.demo_chat_view import DemoChatView
from views.base_gallery_view import GalleryInterface
from views.demo_setting_das_view import CommonSettingDasView
from views.template_demo_view import TemplateDemoView

from views.common.signal_bus import signalBus
from views.common.translator import Translator
from views.common.config import ZH_SUPPORT_URL, EN_SUPPORT_URL, cfg
from views.demo_common_view import DemoCommonView
from views.demo_setting_view import CommonSettingView


class Widget(QFrame):
    def __init__(self, text: str, parent=None):
        super().__init__(parent=parent)
        # 创建一个带副标题样式的标签，显示传入的文本
        self.label = SubtitleLabel(text, self)
        self.hBoxLayout = QHBoxLayout(self)  # 使用水平布局管理器

        # 设置标签字体大小
        setFont(self.label, 24)
        # 将标签添加到水平布局，并设置伸缩因子为 1
        self.hBoxLayout.addWidget(self.label, 1)

        # 必须给子界面设置全局唯一的对象名，以便后续查找
        self.setObjectName(text.replace(" ", "-"))


class MainWindow(FluentWindow):
    """
    主窗口类，继承自 FluentWindow。
    实现了应用的主界面，包括导航栏、多个子页面以及主题监听器等功能。
    """

    def __init__(self):
        super().__init__()
        self.initWindow()  # 初始化窗口属性

        # 创建系统主题监听器，用于检测和响应主题变化
        self.themeListener = SystemThemeListener(self)

        # 初始化各个子页面
        """
        核心修改点一 ： 这里添加你的页面
        """
        self.homeView = DemoCommonView(self)
        self.chatView = DemoChatView(self)
        self.settingView = CommonSettingView(self)
        self.settingDasView = CommonSettingDasView(self)
        self.templateDemoView = TemplateDemoView(self)

        # 启用亚克力效果
        self.navigationInterface.setAcrylicEnabled(True)
        self.connectSignalToSlot()  # 连接信号与槽

        # 初始化导航栏及其内容
        self.initNavigation()

        # 结束启动画面
        self.splashScreen.finish()

        # 开始监听系统主题变化
        self.themeListener.start()

    def initNavigation(self):
        """初始化导航栏"""
        pos = NavigationItemPosition.SCROLL  # 设置导航项位置为可滚动区域

        """
        核心修改点二 ： 把页面添加到导航栏
        """
        # 添加首页视图
        self.addSubInterface(self.homeView, FIF.SPEED_HIGH, "首页", pos)
        # 添加聊天演示视图
        self.addSubInterface(self.chatView, FIF.CAFE, "表格原理Demo", pos)
        # 添加模板演示视图
        self.addSubInterface(self.settingDasView, FIF.LAYOUT, "数据库编辑", pos)
        # 添加DAS层面查询
        self.addSubInterface(self.templateDemoView, FIF.LAYOUT, "模板演示", pos)

        # 在导航栏中添加分隔符
        self.navigationInterface.addSeparator()
        # 添加设置视图
        self.addSubInterface(
            self.settingView,
            FIF.SETTING,
            self.tr("Settings"),
            NavigationItemPosition.BOTTOM,  # 设置为固定在导航栏底部
        )

    def initWindow(self):
        """初始化窗口属性"""
        self.resize(1200, 1000)  # 设置窗口大小
        self.setMinimumWidth(1000)  # 设置窗口最小宽度
        self.setWindowIcon(
            QIcon(":/images/views/common/images/logo.png")
        )  # 设置窗口图标
        self.setWindowTitle("Demo-桌面端小程序基础框架")  # 设置窗口标题

        # 根据配置启用 Mica 效果（Windows 专属的模糊效果）
        self.setMicaEffectEnabled(cfg.get(cfg.micaEnabled))

        # 创建启动画面
        self.splashScreen = SplashScreen(self.windowIcon(), self)
        self.splashScreen.setIconSize(QSize(106, 106))  # 设置启动画面图标大小
        self.splashScreen.raise_()  # 将启动画面置于最前

        # 窗口居中显示
        desktop = QApplication.screens()[0].availableGeometry()
        w, h = desktop.width(), desktop.height()
        self.move(w // 2 - self.width() // 2, h // 2 - self.height() // 2)
        self.show()  # 显示窗口
        QApplication.processEvents()  # 强制刷新界面

    def resizeEvent(self, e):
        """处理窗口大小变化事件"""
        super().resizeEvent(e)
        if hasattr(self, "splashScreen"):  # 如果启动画面存在，则调整其大小
            self.splashScreen.resize(self.size())

    def closeEvent(self, e):
        """处理窗口关闭事件"""
        self.themeListener.terminate()  # 停止主题监听器
        self.themeListener.deleteLater()  # 删除监听器对象
        super().closeEvent(e)

    def connectSignalToSlot(self):
        """连接信号与槽"""
        # 连接信号：启用/禁用 Mica 效果
        signalBus.micaEnableChanged.connect(self.setMicaEffectEnabled)
        # 连接信号：切换到示例卡片
        signalBus.switchToSampleCard.connect(self.switchToSample)

    def switchToSample(self, routeKey, index, data):
        """
        切换到示例界面，并滚动到指定的卡片。

        参数：
        - routeKey: 子界面的唯一标识符（用于查找目标界面）
        - index: 要滚动到的卡片索引
        - data: 需要传递给目标界面的附加数据
        """
        # 找到当前窗口中所有基于 GalleryInterface 的子界面
        interfaces = self.findChildren(GalleryInterface)
        for w in interfaces:
            if w.objectName() == routeKey:  # 检查对象名是否匹配
                w.setExchangeData(data)  # 设置需要传递的数据
                self.stackedWidget.setCurrentWidget(w, False)  # 切换到目标界面
                w.scrollToCard(index)  # 滚动到指定索引的卡片
